// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package os

import (
	"io/fs"
	"syscall"
)

// Getpagesize返回基础系统的内存页大小。
func Getpagesize() int { return syscall.Getpagesize() }

// 文件表示打开的文件描述符。
type File struct {
	*file // 特定于操作系统的
}

// 文件信息描述一个文件，由Stat和Lstat返回。
type FileInfo = fs.FileInfo

// 文件模式代表文件的模式和权限位。
// 这些位在所有系统上都有相同的定义，因此
// 有关文件的信息可以通过可移植的方式从一个系统移动到另一个系统。并非所有位都适用于所有系统。
// 唯一需要的位是目录的ModeDir。
type FileMode = fs.FileMode

// 定义的文件模式位是文件模式的最高有效位。
// 九个最低有效位是标准的Unix RWX权限。
// 这些位的值应被视为公共API的一部分，
// 可用于有线协议或磁盘表示：它们不得被更改，尽管可能会添加新位。
const (
	// 单个字母是字符串方法格式化使用的缩写
	// 。
	ModeDir        = fs.ModeDir        // d:是一个目录
	ModeAppend     = fs.ModeAppend     // a:只追加
	ModeExclusive  = fs.ModeExclusive  // l:专用
	ModeTemporary  = fs.ModeTemporary  // T:临时文件；仅计划9 
	ModeSymlink    = fs.ModeSymlink    // L:符号链接
	ModeDevice     = fs.ModeDevice     // D:设备文件
	ModeNamedPipe  = fs.ModeNamedPipe  // p:命名管道（FIFO）
	ModeSocket     = fs.ModeSocket     // S:Unix域套接字
	ModeSetuid     = fs.ModeSetuid     // u:setuid 
	ModeSetgid     = fs.ModeSetgid     // g:setgid 
	ModeCharDevice = fs.ModeCharDevice // c:Unix字符设备，当ModeDevice 
	ModeSticky     = fs.ModeSticky     // t:Stick 
	ModeIrregular  = fs.ModeIrregular  // 非常规文件；关于这个文件

	// 类型位的掩码，我们一无所知。对于常规文件，将不设置任何文件。
	ModeType = fs.ModeType

	ModePerm = fs.ModePerm // Unix权限位，0o777 
)

func (fs *fileStat) Name() string { return fs.name }
func (fs *fileStat) IsDir() bool  { return fs.Mode().IsDir() }

// SameFile报告fi1和fi2是否描述同一文件。
// 例如，在Unix上，这意味着两个底层结构的device和inode字段
// 是相同的；在其他系统上
// 该决定可能基于路径名。
// SameFile仅适用于此包的Stat返回的结果。
// 在其他情况下返回false。
func SameFile(fi1, fi2 FileInfo) bool {
	fs1, ok1 := fi1.(*fileStat)
	fs2, ok2 := fi2.(*fileStat)
	if !ok1 || !ok2 {
		return false
	}
	return sameFile(fs1, fs2)
}
